﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace _09_Task基础
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Task有三种不同的启动方式: Task.Run, Task.Factory.StartNew, new Task().Start

            //1.通过Task.Run启动任务
            Task.Run(() => DoWork("Task.Run", 10));

            //2.通过Task.Factory.StartNew启动任务
            Task.Factory.StartNew(() => DoWork("Task.Factory.StartNew", 10));

            //3.通过new Task().Start启动任务
            Task task = new Task(() => DoWork("new Task().Start", 10));
            task.Start();

            //Task与Thread的区别
            //Thread每一次都是会创建一个新的线程，而Task是使用线程池中的线程，线程池中的线程是可以重复使用的
            //Task默认情况下会预先创建4个线程，当线程池中的线程不够用时，会自动创建新的线程
            //Task线程执行完毕后，会自动回收线程，而Thread线程执行完毕后，需要手动回收线程，也就是将对象置为null
            //Task启动的线程默认是后台线程，而Thread启动的线程默认是前台线程，需要设置IsBackground属性为true

            //Task.Run: 这是启动任务的最简单方式，默认使用TaskScheduler.Default 调度器，并线程池中运行
            //Task.Factory.StartNew: 这是启动任务的最灵活方式，可以通过参数指定不同的调度器、任务创建选项等
            //new Task: 这是最基本的创建任务的方式，需要手动调用Start方法启动任务

            //总结
            // Task.Run: 适合简单的任务，不需要太多的参数设置
            // Task.Factory.StartNew: 适合复杂的任务，需要设置不同的参数
            //  new Task: 适合自定义的任务，需要手动调用Start方法启动任务


        }
        /// <summary>
        /// 任务执行的方法
        /// </summary>
        /// <param name="name">名称</param>
        /// <param name="count">循环次数</param>
        public static void DoWork(string name,int count)
        {
            for (int i = 0; i < count; i++)
            {
                Console.WriteLine("{0}：DoWork-:{1}", name,i);
                Thread.Sleep(100);
            }
        }

    }
}
